package com.hsurosy.hsuchain.nft.web.vo;

import com.hsurosy.hsuchain.nft.base.response.SingleResponse;
import lombok.Data;

import static com.hsurosy.hsuchain.nft.base.response.ResponseCode.SUCCESS;

/**
 * 通用响应结果对象
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-05 5:15
 * @Description
 * @Version: v1.0.0
 */
@Data
public class Result<T> {
    /**
     * 状态码
     */
    private String code;

    /**
     * 是否成功
     */
    private Boolean success;

    /**
     * 消息描述
     */
    private String message;

    /**
     * 数据，可以是任何类型的VO
     */
    private T data;

    /**
     * 默认构造方法
     */
    public Result() {
    }

    /**
     * 构造方法，接收成功状态、消息及数据
     *
     * @param success 是否成功
     * @param message 消息描述
     * @param data    数据
     */
    public Result(Boolean success, String message, T data) {
        this.success = success;
        this.message = message;
        this.data = data;
    }

    /**
     * 构造方法，接收成功状态、状态码、消息及数据
     *
     * @param success 是否成功
     * @param code    状态码
     * @param message 消息描述
     * @param data    数据
     */
    public Result(Boolean success, String code, String message, T data) {
        this.success = success;
        this.message = message;
        this.data = data;
        this.code = code;
    }

    /**
     * 使用SingleResponse对象的构造方法
     *
     * @param singleResponse 单一响应对象
     */
    public Result(SingleResponse<T> singleResponse) {
        this.success = singleResponse.getSuccess();
        this.data = singleResponse.getData();
        this.code = singleResponse.getResponseCode();
        this.message = singleResponse.getResponseMessage();
    }

    /**
     * 构建成功的Result对象
     *
     * @param data 数据
     * @param <T>  数据类型
     * @return 成功的Result对象
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(true, SUCCESS.name(), SUCCESS.name(), data);
    }

    /**
     * 构建错误的Result对象
     *
     * @param errorCode 错误码
     * @param errorMsg  错误消息
     * @param <T>       数据类型
     * @return 错误的Result对象
     */
    public static <T> Result<T> error(String errorCode, String errorMsg) {
        return new Result<>(false, errorCode, errorMsg, null);
    }
}
